<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>ES6构造函数</title>
</head>
<body>
  <script>
    /**
     * 1. ES6class是ES5构造函数的语法糖
     * 2. 构造函数
     * 3. 定义方法
     * 4. 静态方法
     * 5. set/get方法
     * 6. class函数不存在变量提升，不可以在声明class之前，进行实例化
    */

    // 1. ES6class是ES5构造函数的语法糖
    // const User = class {

    // }

    // Cannot access 'User' before initialization
    // const test = new User();
    class User {
      // 2. 构造函数
      constructor (name, age) {
        this.name = name;
        this.age = age;
      }
      // 3. 定义方法
      info () {
        console.log(`${this.name} and ${this.age}`);
      }
      // 4. 静态方法
      static say () {
        console.log('say hello');
      }
      // 5. set/get方法
      set sexVal (value) {
        this.sex = value;
      }
      get sexVal () {
        return this.sex;
      }
    }
    // 在原型对象上重写info方法，也可在class里面重写
    User.prototype.info = () => {
      console.log(1212);
    }
    const user = new User('user', 19);
    console.log('user', user);
    // 静态方法只能通过class函数去调用，因为它不在实例对象上
    User.say();
    // user.say is not a function,这里会报错，因为实例上没有该静态方法
    // user.say();

    user.sexVal = '男';
    console.log(user.sex);
  </script>
</body>
</html>